﻿using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Qy.Core;

/// <summary>
/// appsettings.json操作类
/// </summary>
public class AppSettings
{
    static IConfiguration Configuration { get; set; }
    //static string ContentPath { get; set; }

    public AppSettings(string ContentPath)
    {
        string Path = "appsettings.json";

        //如果配置文件 是 根据环境变量来分开了，可以这样写
        //Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json";

        Configuration = new ConfigurationBuilder()
           .SetBasePath(ContentPath)
           .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })
           .Build();
    }

    public AppSettings(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    /// <summary>
    /// 封装要操作的字符
    /// </summary>
    /// <param name="sections">节点配置</param>
    /// <returns></returns>
    public static string App(params string[] sections)
    {
        try
        {
            if (sections.Any())
                return Configuration[string.Join(":", sections)];
        }
        catch (Exception)
        {
            throw;
        }

        return "";
    }

    /// <summary>
    /// 递归获取配置信息数组
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="sections"></param>
    /// <returns></returns>
    public static List<T> App<T>(params string[] sections)
    {
        List<T> list = new();
        Configuration.Bind(string.Join(":", sections), list);
        return list;
    }

    public static T Bind<T>(string key, T t)
    {
        Configuration.Bind(key, t);

        return t;
    }

    public static T GetAppConfig<T>(string key, T defaultValue = default)
    {
        T setting = (T)Convert.ChangeType(Configuration[key], typeof(T));
        var value = setting;
        if (setting == null)
            value = defaultValue;
        return value;
    }

    /// <summary>
    /// 获取配置文件 
    /// </summary>
    /// <param name="key">eg: WeChat:Token</param>
    /// <returns></returns>
    public static string GetConfig(string key)
    {
        return Configuration[key];
    }
}
